/* Die Klasse Band
 * 
 * Die Klasse band kann Zeichenketten auf das aufnehmen und manipulieren
 * Hier wird auch die Position des L/S-Kopfes definiert und bewegt
 * 
 * 
 * Datei:  Band.java           		Autor:    Martin Fischer
 * Datum:  14.11.2011        		Version:  1.0
 *
 *
 */
package kommunikation.Parser;

import kommunikation.Uebersetzung;

public class Band
{
  /*
   * Das Band der Turingmaschine
   */
  private String band; 
  /*
   * Alphabet des bandes
   */
  private Alphabet alphabet; 
  /*
   * Die Position des L/K-Kopfes
   */
  private int positionLSK = 0; 
  private Uebersetzung uebersetzung = new  Uebersetzung ("Deutsch");


  /*
   * Konstruktoren
   * 
   * Hier wird nur lediglich ein Alphabet ?bergeben
   */
  public Band (Alphabet alphabet)
  {
    this.alphabet = alphabet;
  }


  /*
   * Hier wird neben dem Alphabet noch zusaetzlich das Wort welches auf
   * gueltigkeit geprueft werden soll uebergeben
   */
  public Band (Alphabet alphabet, String wort)
  {
    this.alphabet = alphabet;
    band = wort;
  }


  /*
   * Die Methode gibt das Alphabet zurueck
   */
  public Alphabet getAlphabet ()
  {
    return alphabet;
  }


  /*
   * Die Methode gibt die Beschriftung auf dem Band zurueck
   */
  public String getBand ()
  {
    return band;
  }


  /*
   * Neues Wort auf das band schreiben
   */
  public void setBand (String wort)
  {
    this.band = wort;
  }


  /*
   * Die Methode gibt die aktuelle Position des L/S-Kopfes Aus
   */
  public int getPosition ()
  {
    return positionLSK;
  }


  /*
   * Die Methode gibt das aktuelle Zeichen an der Position des 
   * L/S-Kopfes
   */
  public char getAktuellesZeichen ()
  {
    if(!alphabet.istGueltigesZeichen (band.charAt (positionLSK)))
    {
      throw new NichtImAlphabetAusnahme (uebersetzung.lokal.
	  gibUebersetzung ("FNIA")+ ": " + band.charAt (positionLSK));
    }
    return band.charAt (positionLSK);
  }


  /*
   * Auf der aktuellen Position des L/S-Kopfes wird ein Zeichen
   * geschrieben
   */
  public void setAktuellesZeichen (char zeichen)
  {
    StringBuffer sb = new StringBuffer (band);
    sb.setCharAt (positionLSK, zeichen);
    band = sb.toString ();
  }


  /*
   * Bewege den L/S-Kopf nach links
   */
  public void LSLinks ()
  {
    positionLSK--;
    /*
     * wenn wir uns bereits ganz links befinden fuer ein Blacksymbol
     * hinzu
     */
    if (positionLSK < 0)
    {
      band = alphabet.gibZeichen (0) + band;
    }
  }


  /*
   * Bewege den L/S-Kopf nach rechts
   */
  public void LSRechts ()
  {
    positionLSK++;
    /* 
     * wenn wir uns bereits ganz rechts befinden fuer ein Blacksymbol
     * hinzu
     */
    if (positionLSK > (band.length () - 1))
    {
      band = band + alphabet.gibZeichen (0);
    }
  }
  
  
  /*
   * Den L/S-Kopf nicht bewegen
   */
  public void LSStop ()
  {
    /* 
     * Der L/S-Kopf wird nicht bewegt, deswegen brauch auch nich nach 
     * Anfang oder Ende des bandes geprueft werden.
     */
  }
}
